package com.woniuxy.yoga.course.service.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.woniuxy.yoga.commons.core.statedata.CourseState;
import com.woniuxy.yoga.course.dao.model.CourseType;
import com.woniuxy.yoga.course.dao.mapper.CourseTypeMapper;
import com.woniuxy.yoga.course.model.dto.type.AllCourseTypeDTO;
import com.woniuxy.yoga.course.model.exception.CourseException;
import com.woniuxy.yoga.course.model.exception.CourseExceptionCode;
import com.woniuxy.yoga.course.model.param.type.AddCourseTypeParam;
import com.woniuxy.yoga.course.model.param.type.QueryAllCourseTypeParam;
import com.woniuxy.yoga.course.service.service.CourseTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.lang.annotation.Target;
import java.util.List;

/**
 * <p>
 * 课程类型表 服务实现类
 * </p>
 *
 * @author 韦用文,刘存益,郎腾霄
 * @since 2023年11月28日
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements CourseTypeService {

    @Autowired
    private CourseTypeMapper courseTypeMapper;

    /**
     * 新增课程类型
     * @param param
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addCourseType(AddCourseTypeParam param) {
        QueryWrapper<CourseType> wrapper = new QueryWrapper<>();
        wrapper.eq("course_type_name",param.getCourseTypeName());
        //状态不是删除的
        wrapper.notIn("course_type_state",CourseState.COURSE_TYPE_STATE_DELETE);
        CourseType type = courseTypeMapper.selectOne(wrapper);
        //判断是否存在
        if (type!=null) throw new CourseException(CourseExceptionCode.COURSE_EXCEPTION_CODE_COURSE_TYPE_IS_EXIST);
        //对象转换
        CourseType courseType = BeanUtil.toBean(param, CourseType.class);
        //状态初始值设置为禁用 待确认无误之后上传
        courseType.setCourseTypeState(CourseState.COURSE_TYPE_STATE_DISABLE);
        courseTypeMapper.insert(courseType);
    }

    /**
     * 课程类型启用
     * @param courseTypeId
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void modifyCourseTypeNormal(Integer courseTypeId) {
        CourseType courseType = courseTypeMapper.selectById(courseTypeId);
        //判断是否存在
        if (courseType==null) throw new CourseException(CourseExceptionCode.COURSE_EXCEPTION_CODE_COURSE_TYPE_NOT_EXIST);
        //判断状态是否是禁用状态
        if (courseType.getCourseTypeState()!=CourseState.COURSE_TYPE_STATE_DISABLE) throw new CourseException(CourseExceptionCode.COURSE_EXCEPTION_CODE_COURSE_TYPE_STATE_ERROR);
        //修改成启用
        courseType.setCourseTypeState(CourseState.COURSE_TYPE_STATE_NORMAL);
        courseTypeMapper.updateById(courseType);
    }

    /**
     * 课程类型删除
     * @param courseTypeId
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void modifyCourseTypeDelete(Integer courseTypeId) {
        CourseType courseType = courseTypeMapper.selectById(courseTypeId);
        //判断是否存在
        if (courseType==null) throw new CourseException(CourseExceptionCode.COURSE_EXCEPTION_CODE_COURSE_TYPE_NOT_EXIST);
        //判断状态是否是禁用状态
        if (courseType.getCourseTypeState()!=CourseState.COURSE_TYPE_STATE_DISABLE) throw new CourseException(CourseExceptionCode.COURSE_EXCEPTION_CODE_COURSE_TYPE_STATE_ERROR);
        //修改成删除
        courseType.setCourseTypeState(CourseState.COURSE_TYPE_STATE_DELETE);
        courseTypeMapper.updateById(courseType);
    }

    /**
     * 查询所有的课程类型
     * @param param
     * @return
     */
    @Override
    public List<AllCourseTypeDTO> queryAllCourseType(QueryAllCourseTypeParam param) {
        QueryWrapper<CourseType> wrapper = new QueryWrapper<>();
        //课程类型搜索
        if (ObjectUtil.isNotEmpty(param.getCourseTypeName())){
            wrapper.like("course_type_name",param.getCourseTypeName());
        }
        //类型状态搜索
        if (ObjectUtil.isNotEmpty(param.getCourseTypeState())){
            wrapper.eq("course_type_state",param.getCourseTypeState());
        }
        //索引排序
        wrapper.orderByAsc("course_type_id");
        //查询数据
        List<CourseType> courseTypes = courseTypeMapper.selectList(wrapper);
        //集合转换
        List<AllCourseTypeDTO> allCourseTypeDTOS = BeanUtil.copyToList(courseTypes, AllCourseTypeDTO.class);
        //返回数据
        return allCourseTypeDTOS;
    }
}
